home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks97 / WarriorsProgress.sit / Warrior’s Progress / source code / Source / Libraries / Views / Standard Arrangements / PaneColumnBase.cp < prev    next >
Text File  |  1997-06-28  |  3KB  |  142 lines

  1. // PaneColumnBase.cp
  2.  
  3. #ifndef PaneColumnBase_h
  4. #include "PaneColumnBase.h"
  5. #endif
  6. #ifndef MinMax_h
  7. #include "MinMax.h"
  8. #endif
  9. #ifndef ArrangementLoop_h
  10. #include "ArrangementLoop.h"
  11. #endif
  12. #ifndef ConstArrangementLoop_h
  13. #include "ConstArrangementLoop.h"
  14. #endif
  15.  
  16. void PaneColumnBase::Arrange( Rectangle bounds )
  17.   {
  18.     uint16 minimum = MinimumHeight();
  19.     uint16 height = bounds.Height();
  20.     
  21.     uint16 slop = ( height > minimum )
  22.                       ? height - minimum
  23.                       : 0;
  24.     
  25.     uint16 sloppySlop = ( slop > 0 )
  26.                               ? height - BestHeight( height )
  27.                               : 0;
  28.     
  29.     int16 topSide = bounds.top;
  30.     
  31.     for ( ArrangementLoop pane( *this ); pane.Unfinished(); pane++ )
  32.       {
  33.         uint16 paneMinimum = (*pane)->MinimumHeight();
  34.         
  35.         uint16 paneHeight = ( slop > 0 )
  36.                                     ? (*pane)->BestHeight( paneMinimum + slop )
  37.                                     : Min( height, paneMinimum );
  38.         
  39.         if ( sloppySlop > 0 )
  40.           {
  41.             paneHeight += sloppySlop;
  42.             sloppySlop = 0;
  43.           }
  44.  
  45.         Assert( paneHeight <= height );
  46.         height -= paneHeight;
  47.         if ( paneHeight > paneMinimum )
  48.             slop -= paneHeight - paneMinimum;
  49.         
  50.         Rectangle paneArea( bounds.left,
  51.                                   topSide,
  52.                                   bounds.right,
  53.                                   topSide + paneHeight );
  54.         Assert( bounds >= paneArea );
  55.         
  56.         pane->SetBounds( paneArea );
  57.         topSide = paneArea.bottom;
  58.       }
  59.   }
  60.  
  61. uint16 PaneColumnBase::MinimumHeight() const
  62.   {
  63.     return Total( &Sizeable::MinimumHeight );
  64.   }
  65.  
  66. uint16 PaneColumnBase::MinimumWidth() const
  67.   {
  68.     return Maximum( &Sizeable::MinimumWidth );
  69.   }
  70.  
  71. uint16 PaneColumnBase::MaximumHeight() const
  72.   {
  73.     return Total( &Sizeable::MaximumHeight );
  74.   }
  75.  
  76. uint16 PaneColumnBase::MaximumWidth() const
  77.   {
  78.     return Minimum( &Sizeable::MaximumWidth );
  79.   }
  80.  
  81. uint16 PaneColumnBase::ReasonableHeight() const
  82.   {
  83.     return Total( &Sizeable::ReasonableHeight );
  84.   }
  85.  
  86. uint16 PaneColumnBase::ReasonableWidth() const
  87.   {
  88.     return Maximum( &Sizeable::ReasonableWidth );
  89.   }
  90.  
  91. uint16 PaneColumnBase::BestHeight() const
  92.   {
  93.     return Total( &Sizeable::BestHeight );
  94.   }
  95.  
  96. uint16 PaneColumnBase::BestHeight( uint16 bound ) const
  97.   {
  98.     uint16 minimum = MinimumHeight();
  99.     
  100.     if ( bound <= minimum )
  101.         return bound;
  102.  
  103.     uint16 slop = bound - minimum;
  104.     
  105.     uint16 height = 0;
  106.     for ( ConstArrangementLoop pane( *this ); pane.Unfinished(); pane++ )
  107.       {
  108.         uint16 paneMinimum = (*pane)->MinimumHeight();
  109.         uint16 paneHeight = (*pane)->BestHeight( paneMinimum + slop );
  110.         
  111.         Assert( paneHeight >= paneMinimum );
  112.         
  113.         if ( !CanAdd( height, paneHeight ) )
  114.             return maxuint16;
  115.  
  116.         height += paneHeight;
  117.         slop -= paneHeight - paneMinimum;
  118.       }
  119.     
  120.     Assert( height <= bound );
  121.     return height;
  122.   }
  123.  
  124. uint16 PaneColumnBase::BestWidth() const
  125.   {
  126.     return Maximum( &Sizeable::BestWidth );
  127.   }
  128.  
  129. uint16 PaneColumnBase::BestWidth( uint16 bound ) const
  130.   {
  131.     uint16 best = 0;
  132.     
  133.     for ( ConstArrangementLoop pane( *this ); pane.Unfinished(); pane++ )
  134.       {
  135.         uint16 width = (*pane)->BestWidth( bound );
  136.         if ( width > best )
  137.             best = width;
  138.       }
  139.     
  140.     return best;
  141.   }
  142.